import axios from 'axios'
// 从vant组件库中按需导入 Toast 提示消息组件
import { Toast } from 'vant'
import store from '@/store/index.js'
import router from '@/router'
// console.log(store)
// 导入路由模块
// import router from '@/router/index.js'
// console.log(store)
// 线上
// const root = 'http://www.liulongbin.top:8000'
const root = 'http://192.168.141.47:8000'
const request = axios.create({
  // baseURL: 'http://www.liulongbin.top:8000'
  // baseURL: 'http://192.168.141.73:8000'
  baseURL: root
})

// 拦截器的挂载一定要放到request实例创建之后
// 由于我们在项目中是基于reqest实例对象发起的请求，因此，拦截器一定要挂载给request，而不是axios
// 添加请求拦截器     config是每次请求时候的配置选项
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 展示loading 效果
  Toast.loading({
    message: '加载中...',
    duration: 0
  })
  // 从vuex中获取token值
  const tokenStr = store.state.tokenInfo.token
  if (tokenStr) {
    // 只有tokenStr中有值，才有必要挂载到请求头的Authorization中
    config.headers.Authorization = 'Bearer ' + tokenStr
  }
  // console.log(config)
  return config
}, function (error) {
  // 对请求错误做些什么
  // 隐藏loading效果
  Toast.clear()
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  // 隐藏loading效果
  Toast.clear()
  return response
}, async function (error) {
  // 对响应错误做点什么
  // 隐藏loading效果
  Toast.clear()

  // 判断一下失败的status状态码是否为401
  // 如果是401证明是token过期导致的有权限的接口调用失败
  // console.dir(error)
  // if (error.response.status === 401) {
  //   // 证明token过期了
  //   // 强制跳转到登录页
  //   router.replace('/login?pre=' + router.currentRoute.fullPath)
  //   // 清空vuex 和 localStorage中的数据
  //   store.commit('cleanState')
  // }

  // 从vuex中获取refresh_token的值
  const refreshToken = store.state.tokenInfo.refresh_token
  // 判断响应状态码是否为401
  if (error.response.status === 401 && refreshToken) {
    // 执行换取token的操作
    try {
      // 千万不要再这里直接使用request对象，来发起换取token的请求
      const { data: res } = await axios({
        method: 'put',
        // url: 'http://www.liulongbin.top:8000/v1_0/authorizations',
        // url: 'http://192.168.141.73:8000/v1_0/authorizations',
        url: root + '/v1_0/authorizations',
        headers: {
          Authorization: 'Bearer ' + refreshToken
        }
      })
      // console.log(res)
      // 用新token 替换到vuex和localStorage中的旧token
      store.commit('updateTokenInfo', { token: res.data.token, refresh_token: refreshToken })
      // 继续完成上次失败的请求
      // 请求的method  url 请求参数
      return request(error.config)
    } catch {
      // 只要能够执行到catch中的代码，证明token和refresh_token都过期了
      store.commit('cleanState')
      // 强制用户跳转到登录页
      router.replace('/login?pre=' + router.currentRoute.fullPath)
    }
  }
  // 如果refresh_token有值，且响应状态码为401.则应该换取token操作
  return Promise.reject(error)
})

export default request
